/*!
 * # 模块 JS:
 *  Calc - 计算工作日
 * 
 * # 描述:
 *  计算两个日期之间的工作日数目，或者一个日期经过指定工作日后的新日期。
 * 
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

/*
 * @param {Object} $    jQuery 命名空间。
 * @param {Object} $$   pittypat 命名空间。
 * @param {Object} _mod 模块 Apps (应用与功能) 的命名空间。
 * 
 * 使用 pittypat.namespace('...') 以确保 _mod 命名空间是存在的。
 * 
 * 更多说明请参见：
 * https://www.pittypat.work/com/waln/pittypat/coding/help/index.html#js。
 */
(function ($, $$, _mod) {
    'use strict';

    /*
     * 为登录用户注册一个处理函数。
     * 由于没有为匿名用户注册处理函数，那么当发现用户尚未登录时，则会默认跳转到首页（登录页）。
     * 
     * 如果需要为匿名用户添加处理逻辑，应该使用如下格式的代码：
     * $$({
     *     authorized: function (_) {
     *         ...
     *     },
     *     anonymous: function (_) {
     *         // 跳转到自定义的登录页面
     *         window.location = '../../../../login.html';
     *     }
     * });
     * 
     * 如果需要自定义登录页面，则可能还需要添加 init 等处理函数。详细帮助请参见：
     * https://www.pittypat.work/com/waln/pittypat/ref/help/pittypat.js.html#pittypat。
     *
     * 参数 _ 的定义如下：
     * {
     *    user:  {Object},  // (只读)当前用户的用户信息
     *    app:   {Object},  // (只读)当前应用的命名空间，如果无法定位，则为 null
     *    mod:   {Object},  // (只读)当前模块的命名空间，如果无法定位，则为 null
     *    init:  {Boolean}, // (只读)是否正在初始化页面
     *    first: {Boolean}, // (只读)是否首次执行 authorized
     *    data:  {any}      // (读写)前述的 data 数据，或 data 函数返回的结果
     * }
     */
    $$(function (_) {
        var
            // 模块 UI 命名空间
            _ui = _mod.ui = _mod.ui || {},
            // 模块 API 命名空间
            _api = _mod.api;

        function parseDate($box) {
            var s = $box.val().trim();
            if (s.length == 0) {
                return null;
            }

            if (s.length == 8) {
                s = s.substr(0, 4) + '-' + s.substr(4, 2) + '-' + s.substr(6, 2);
            }

            return Number.isNaN(Date.parse(s)) ? null : s;
        }

        if (_.init) {
            var today = new Date(),
                sToday = $$.util.fmt.day(today, '-');

            // 工作日
            (function () {
                var $from = $('#from-date1').val(sToday),
                    $to = $('#to-date1').val(sToday),
                    $days = $('#workdays1');

                _api.diff
                    .on('success', function (e) {
                        $days.text(e.result);
                    })
                    .on('error', function (e) {
                        $days.text(e.message);
                    });

                $('#from-date1,#to-date1').on('change', function () {
                    var from = parseDate($from),
                        to = parseDate($to);

                    if (from && to) {
                        _api.diff
                            .one('args', function (e) {
                                e.args = {
                                    from: from,
                                    to: to
                                };
                            })();
                    } else {
                        if (!from) {
                            $days.text('没有提供有效的起始日期。');
                        } else {
                            $days.text('没有提供有效的截至日期。');
                        }
                    }
                });
            })();

            // 截至日期
            (function () {
                var $from = $('#from-date2').val(sToday),
                    $to = $('#to-date2'),
                    $days = $('#workdays2');

                _api.add
                    .on('success', function (e) {
                        $to.text($$.util.fmt.day(e.result));
                    })
                    .on('error', function (e) {
                        $to.text(e.message);
                    });

                $('#from-date2,#workdays2').on('change', function () {
                    var from = parseDate($from),
                        days = $days.val() ? parseInt($days.val(), 10) : 0;

                    if (from && !Number.isNaN(days)) {
                        if (days == 0) {
                            $to.text(from);
                        } else {
                            _api.add
                                .one('args', function (e) {
                                    e.args = {
                                        from: from,
                                        days: days
                                    };
                                })();
                        }
                    } else {
                        if (!from) {
                            $to.text('没有提供有效的起始日期。');
                        } else {
                            $to.text('没有提供有效的工作日数目。');
                        }
                    }
                });
            })();
        }
    });
})(jQuery, pittypat, pittypat.namespace('waln.calendar.calc'));